home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE TOSDebug;(* V#053 *) (* Überarbeitet von M.Grebe *)
- ⓪ (*$B+,R-,F-*)
- ⓪
- ⓪ (*
- ⓪"Stand Nov. 1991:
- ⓪$- Der Debugger reserviert sich einen eigenen Bildschirm und speichert
- ⓪&die Cursorpositionen zwischen, sodaß der Bildschirmaufbau nicht mehr
- ⓪&gestört wird.
- ⓪$- Mit T läßt sich eine Protokollierung der Ausgabe in der Datei DEBUG.LST
- ⓪&im Root-Verzeichnis des aktuellen Laufwerks ein- bzw. ausschalten.
- ⓪$- ESC schaltet auf den Programmbildschirm und zurück
- ⓪$- B unterdrückt die Bildschirmausgabe, die eventuelle Protokollierung in
- ⓪&eine Datei läuft weiter
- ⓪$- P zeigt die aktuelle Prozedur
- ⓪$- L ab der aktuellen Zeile wird ein Listing der folgenden Zeilen
- ⓪&bis zum Prozedur- oder Programmende ausgegeben.
- ⓪$- M setzt eine Marke (B wie Breakpoint schon vergeben) hinter der der
- ⓪&Programmablauf wieder unterbrochen wird.
- ⓪&Die Zeilenadresse erhält man aus L. Somit ist dieser Breakpoint
- ⓪&auf die aktuelle Prozedur beschränkt, aber immerhin
- ⓪$- Z schaltet nun Zeilenadressen ab (ich brauchte L)
- ⓪
- ⓪$Bekannte Fehler:
- ⓪&Läuft nicht mit Programmen, die selbst den Bildschirm umlegen.
- ⓪&Man könnte es zwar einbauen, indem man sich immer die aktuellen
- ⓪&Adressen holt, ich habe es aber noch nie grbraucht - drum.
- ⓪ *)
- ⓪
- ⓪ FROM SYSTEM IMPORT ADR,ADDRESS,ASSEMBLER,BYTE,CAST,WORD,LONGWORD;
- ⓪
- ⓪ FROM Excepts IMPORT InstallPreExc;
- ⓪
- ⓪ FROM PrgCtrl IMPORT TermProcess,CatchProcessTerm,TermCarrier;
- ⓪
- ⓪ FROM Strings IMPORT Assign,Empty,Insert,Length;
- ⓪
- ⓪ FROM MOSGlobals IMPORT UserBreak,MemArea;
- ⓪
- ⓪ FROM SysTypes IMPORT ExcSet,TRAP5,ExcDesc;
- ⓪
- ⓪ FROM Terminal IMPORT GotoXY,Read,Write,WriteLn,CondRead,WriteString,
- ⓪5FlushKbd,ReadString;
- ⓪
- ⓪ FROM ModCtrl IMPORT GetModName;
- ⓪
- ⓪ FROM SysUtil1 IMPORT Peek;
- ⓪
- ⓪ FROM Files IMPORT Access,ReplaceMode,Create,Close,File;
- ⓪
- ⓪ FROM GEMDOS IMPORT Alloc,Free;
- ⓪
- ⓪ FROM XBIOS IMPORT ScreenPhysicalBase,ScreenLogicalBase,SetScreenBase,VSync;
- ⓪
- ⓪ IMPORT StrConv,Text;
- ⓪
- ⓪ CONST ypos=24;
- ⓪&space=' ';
- ⓪
- ⓪ TYPE Mode=(m2Line,asmLine,procEntry,procExit);
- ⓪
- ⓪ VAR waitnext,waitkey,screen,file,debugscreen,switchscreen,breakpoint:BOOLEAN;
- ⓪$outfile:File;
- ⓪$allocadr,logbase,physbase,debugbase:ADDRESS;
- ⓪$level:LONGINT;
- ⓪$breakadr:LONGCARD;
- ⓪$xpos:CARDINAL;
- ⓪
- ⓪ PROCEDURE SaveCur;
- ⓪ BEGIN
- ⓪"Write(33C); Write('j');
- ⓪ END SaveCur;
- ⓪
- ⓪ PROCEDURE RestoreCur;
- ⓪ BEGIN
- ⓪"Write(33C); Write('k');
- ⓪ END RestoreCur;
- ⓪
- ⓪ PROCEDURE WriteNew(ch:CHAR);
- ⓪ BEGIN
- ⓪"IF screen THEN
- ⓪$Write(ch);
- ⓪$INC(xpos)
- ⓪"END;
- ⓪"IF file THEN
- ⓪$Text.Write(outfile,ch)
- ⓪"END;
- ⓪ END WriteNew;
- ⓪
- ⓪ PROCEDURE ConvTab(VAR str:ARRAY OF CHAR);
- ⓪ VAR pos:CARDINAL;
- ⓪$ok:BOOLEAN;
- ⓪ BEGIN
- ⓪"pos:=LENGTH(str);
- ⓪"IF pos>0 THEN
- ⓪$REPEAT
- ⓪&DEC(pos);
- ⓪&IF str[pos]=CHR(9) THEN
- ⓪(str[pos]:=' ';
- ⓪(Insert(' ',pos,str,ok);
- ⓪&END
- ⓪$UNTIL pos=0
- ⓪"END
- ⓪ END ConvTab;
- ⓪
- ⓪ PROCEDURE WriteStringNew(s:ARRAY OF CHAR);
- ⓪ VAR i:CARDINAL;
- ⓪$ok:BOOLEAN;
- ⓪$str:ARRAY[0..128] OF CHAR;
- ⓪ BEGIN
- ⓪"Assign(s,str,ok);
- ⓪"ConvTab(str);
- ⓪"IF screen THEN
- ⓪$INC(xpos,Length(str));
- ⓪$WriteString(str)
- ⓪"END;
- ⓪"IF file THEN
- ⓪$Text.WriteString(outfile,str)
- ⓪"END;
- ⓪ END WriteStringNew;
- ⓪
- ⓪ PROCEDURE WriteLnNew;
- ⓪ BEGIN
- ⓪"IF screen THEN
- ⓪$WriteLn; xpos:=0
- ⓪"END;
- ⓪"IF file THEN
- ⓪$Text.WriteLn(outfile)
- ⓪"END;
- ⓪ END WriteLnNew;
- ⓪
- ⓪ PROCEDURE WriteLHex(v:LONGWORD);
- ⓪ BEGIN
- ⓪"WriteStringNew(StrConv.LHexToStr(v,9))
- ⓪ END WriteLHex;
- ⓪
- ⓪ PROCEDURE ShowProc(adr:LONGCARD);
- ⓪ VAR proc,name:ARRAY [0..39] OF CHAR; rel:LONGCARD;
- ⓪ BEGIN
- ⓪"GetModName(adr,name,rel,proc);
- ⓪"WriteLnNew;
- ⓪"WriteStringNew('Modul '); WriteStringNew(name); WriteNew(',');
- ⓪"WriteStringNew('Procedure '); WriteStringNew(proc); WriteLnNew;
- ⓪ END ShowProc;
- ⓪
- ⓪ PROCEDURE Listing(listadr:LONGCARD);
- ⓪ TYPE String=ARRAY[0..255] OF CHAR;
- ⓪ VAR dummy:LONGCARD;
- ⓪$ptr:POINTER TO CARDINAL;
- ⓪$strptr:POINTER TO String;
- ⓪$ch:CHAR;
- ⓪ BEGIN
- ⓪"ShowProc(listadr);
- ⓪"ptr:=CAST(ADDRESS,listadr-2L);
- ⓪"REPEAT
- ⓪$INC(ptr,2L);
- ⓪$IF ptr^=$4e45 THEN
- ⓪&INC(ptr,2L);
- ⓪&IF (ptr^=0) OR (ptr^=10) THEN
- ⓪(strptr:=CAST(ADDRESS,ptr);
- ⓪(INC(strptr,2L);
- ⓪(ptr:=ptr+CAST(ADDRESS,Length(strptr^)-2);
- ⓪(IF ODD(ptr) THEN
- ⓪*INC(ptr)
- ⓪(END;
- ⓪(WriteLHex(CAST(LONGCARD,ptr)+4L); WriteStringNew(strptr^); WriteLnNew;
- ⓪&END
- ⓪$END;
- ⓪"UNTIL ptr^=$4e5d;
- ⓪ END Listing;
- ⓪
- ⓪ PROCEDURE dispRegs(VAR info:ExcDesc);
- ⓪ BEGIN
- ⓪"WriteLnNew;
- ⓪"WITH info DO
- ⓪$WriteStringNew('D0:'); WriteLHex(regD0);
- ⓪$WriteStringNew(' D1:'); WriteLHex(regD1);
- ⓪$WriteStringNew(' D2:'); WriteLHex(regD2);
- ⓪$WriteStringNew(' D3:'); WriteLHex(regD3);
- ⓪$WriteLnNew;
- ⓪$WriteStringNew('D4:'); WriteLHex(regD4);
- ⓪$WriteStringNew(' D5:'); WriteLHex(regD5);
- ⓪$WriteStringNew(' D6:'); WriteLHex(regD6);
- ⓪$WriteStringNew(' D7:'); WriteLHex(regD7);
- ⓪$WriteLnNew;
- ⓪$WriteStringNew('A0:'); WriteLHex(regA0);
- ⓪$WriteStringNew(' A1:'); WriteLHex(regA1);
- ⓪$WriteStringNew(' A2:'); WriteLHex(regA2);
- ⓪$WriteStringNew(' A3:'); WriteLHex(regA3);
- ⓪$WriteLnNew;
- ⓪$WriteStringNew('A4:'); WriteLHex(regA4);
- ⓪$WriteStringNew(' A5:'); WriteLHex(regA5);
- ⓪$WriteStringNew(' A6:'); WriteLHex(regA6);
- ⓪$WriteStringNew(' A7:'); WriteLHex(regUSP);
- ⓪"END
- ⓪ END dispRegs;
- ⓪
- ⓪ PROCEDURE dispLine(mode:Mode; VAR info:ExcDesc);
- ⓪ VAR buffered:BOOLEAN; bufCh:CHAR;
- ⓪
- ⓪"PROCEDURE KeyPress():BOOLEAN;
- ⓪"BEGIN
- ⓪$CondRead(bufCh,buffered);
- ⓪$RETURN buffered
- ⓪"END KeyPress;
- ⓪
- ⓪"PROCEDURE GetKey(VAR ch:CHAR);
- ⓪"BEGIN
- ⓪$IF buffered THEN
- ⓪&buffered:=FALSE;
- ⓪&ch:=bufCh
- ⓪$ELSE
- ⓪&Read(ch)
- ⓪$END
- ⓪"END GetKey;
- ⓪
- ⓪ VAR ch:CHAR;
- ⓪$s:ARRAY[0..9] OF CHAR;
- ⓪$p:CARDINAL;
- ⓪$done,ok:BOOLEAN;
- ⓪$ps:POINTER TO ARRAY[0..160] OF CHAR;
- ⓪$proc,name:ARRAY[0..39] OF CHAR;
- ⓪$rel:LONGCARD;
- ⓪
- ⓪ BEGIN(* dispLine *)
- ⓪"IF Active THEN
- ⓪$Step:=0L
- ⓪"END;
- ⓪"IF (Step<>0L) THEN
- ⓪$DEC(Step);
- ⓪$IF (Step=0L) OR breakpoint THEN
- ⓪&Active:=TRUE; Continuous:=FALSE; switchscreen:=TRUE; breakadr:=0L;
- ⓪&SetScreenBase(debugbase,debugbase,-1);
- ⓪&VSync;
- ⓪&GotoXY(xpos,ypos); WriteLn;
- ⓪$END
- ⓪"END;
- ⓪"xpos:=0;
- ⓪"IF waitkey THEN
- ⓪$buffered:=FALSE;
- ⓪$IF ~Continuous OR KeyPress() THEN
- ⓪&IF Step<>0L THEN
- ⓪(SetScreenBase(debugbase,debugbase,-1);
- ⓪(VSync;
- ⓪(Active:=TRUE; Continuous:=FALSE; switchscreen:=TRUE;
- ⓪&END;
- ⓪&REPEAT
- ⓪(GetKey(ch);
- ⓪(ok:=TRUE;
- ⓪(CASE CAP(ch) OF
- ⓪*11C : SetScreenBase(debugbase,-1L,-1); (* Tab *)
- ⓪0VSync;
- ⓪0Write(33C); Write('E'); ok:=FALSE |
- ⓪*33C : debugscreen:=~debugscreen; ok:=FALSE; (* ESC *)
- ⓪0IF debugscreen THEN
- ⓪2SetScreenBase(-1L,debugbase,-1)
- ⓪0ELSE
- ⓪2SetScreenBase(-1L,physbase,-1)
- ⓪0END;
- ⓪0VSync |
- ⓪*15C : Continuous:=TRUE| (* RETURN *)
- ⓪*' ' : Continuous:=FALSE| (* SPACE *)
- ⓪*3C : TermProcess(UserBreak)| (* CTRL-C *)
- ⓪*'A' : Step:=0L; Active:=TRUE; Continuous:=FALSE |
- ⓪*'S' : WriteString('Step? '); ReadString(s); p:=0;
- ⓪0Step:=StrConv.StrToLCard(s,p,done);
- ⓪0IF done THEN
- ⓪2Active:=FALSE; Continuous:=TRUE;
- ⓪2switchscreen:=FALSE;
- ⓪0END|
- ⓪*'Z' : LineAddr:=~LineAddr; ok:=FALSE|
- ⓪*'H' : Hex:=TRUE; ok:=FALSE|
- ⓪*'D' : Hex:=FALSE; ok:=FALSE|
- ⓪*'R' : dispRegs(info); ok:=FALSE|
- ⓪*'B' : screen:=~screen; ok:=FALSE;
- ⓪0IF screen THEN
- ⓪2WriteString('Bildschirmausgabe aktiv'); switchscreen:=TRUE;
- ⓪0ELSE
- ⓪2WriteString('Bildschirmausgabe inaktiv'); switchscreen:=FALSE;
- ⓪0END;
- ⓪0WriteLn |
- ⓪*'M' : WriteString('Breakpoint nach Zeile an Adresse:'); ReadString(s); p:=0;
- ⓪0breakadr:=StrConv.StrToLCard(s,p,done);
- ⓪0IF done THEN
- ⓪2Active:=FALSE; Continuous:=TRUE; Step:=4294967295;
- ⓪2switchscreen:=FALSE;
- ⓪0ELSE
- ⓪2breakadr:=0L;
- ⓪0END;
- ⓪0breakpoint:=FALSE |
- ⓪*'T' : file:=~file; ok:=FALSE;
- ⓪0IF file THEN
- ⓪2WriteString('Dateiausgabe aktiv')
- ⓪0ELSE
- ⓪2WriteString('Dateiausgabe inaktiv')
- ⓪0END;
- ⓪0WriteLn |
- ⓪*'L' : Listing(info.regPC); ok:=FALSE |
- ⓪*'P' : ShowProc(info.regPC); ok:=FALSE |
- ⓪(ELSE
- ⓪*ok:=FALSE
- ⓪(END
- ⓪&UNTIL ok
- ⓪$END
- ⓪"END;
- ⓪"IF waitnext THEN
- ⓪$FlushKbd; waitkey:=TRUE; waitnext:=FALSE
- ⓪"END;
- ⓪"ps:=info.regPC; (* PC hinter Zeilentext setzen *)
- ⓪"INC(info.regPC,Length(ps^)+1);
- ⓪"IF ODD(info.regPC) THEN
- ⓪$INC(info.regPC)
- ⓪"END;
- ⓪"IF breakadr=info.regPC THEN
- ⓪$breakpoint:=TRUE
- ⓪"END;
- ⓪"IF Active THEN (* Zeile anzeigen *)
- ⓪$WriteLnNew;
- ⓪$IF (mode=m2Line) OR (mode=asmLine) THEN
- ⓪&WriteLnNew;
- ⓪&IF LineAddr THEN
- ⓪(WriteLHex(info.regPC);
- ⓪(WriteStringNew(':');
- ⓪(GetModName(info.regPC,name,rel,proc);
- ⓪(WriteStringNew(name);
- ⓪(WriteStringNew(' / ');
- ⓪(IF ~Empty(proc) THEN
- ⓪*WriteStringNew(proc)
- ⓪(ELSE
- ⓪*WriteStringNew(StrConv.LHexToStr(rel,5))
- ⓪(END;
- ⓪(WriteLnNew;
- ⓪&END;
- ⓪&IF ps^[0]=12C (* LF *) THEN
- ⓪(INC(ps)
- ⓪&END;
- ⓪&WriteStringNew(ps^);
- ⓪&WriteLnNew;
- ⓪$ELSE
- ⓪&IF mode=procEntry THEN
- ⓪(WriteStringNew('Enter '); INC(level);
- ⓪&ELSE
- ⓪(WriteStringNew(' Exit '); DEC(level);
- ⓪&END;
- ⓪&WriteStringNew(ps^);
- ⓪&WriteStringNew(' ('); WriteStringNew(StrConv.IntToStr(level,0)); WriteNew(')');
- ⓪$END;
- ⓪"END;
- ⓪"SetScreenBase(logbase,physbase,-1);
- ⓪"VSync;
- ⓪ END dispLine;
- ⓪
- ⓪
- ⓪ PROCEDURE HdlExc(VAR info:ExcDesc):BOOLEAN;
- ⓪
- ⓪"PROCEDURE loadValue(VAR v:ARRAY OF BYTE);
- ⓪"(* holt Wert vom A3-Stack und korrigiert A3 dabei auch *)
- ⓪"VAR n:CARDINAL;
- ⓪"BEGIN
- ⓪$n:=HIGH(v);
- ⓪$IF n=0 THEN
- ⓪&INC(n)
- ⓪$END;
- ⓪$DEC(info.regA3.p,n+1);
- ⓪$Peek(info.regA3.p,v);
- ⓪"END loadValue;
- ⓪
- ⓪"PROCEDURE dispNum(size:CARDINAL; signed:BOOLEAN);
- ⓪"VAR by:BYTE;
- ⓪&wd:WORD;
- ⓪&lw:LONGWORD;
- ⓪"BEGIN
- ⓪$IF size=4 THEN
- ⓪&loadValue(lw);
- ⓪$ELSE
- ⓪&IF size=2 THEN
- ⓪(loadValue(wd);
- ⓪&ELSE
- ⓪(loadValue(by);
- ⓪(IF signed THEN
- ⓪*wd:=WORD(INT(by))
- ⓪(ELSE
- ⓪*wd:=WORD(ORD(by))
- ⓪(END
- ⓪&END;
- ⓪&IF signed THEN
- ⓪(lw:=LONGWORD(LONG(INTEGER(wd)))
- ⓪&ELSE
- ⓪(lw:=LONGWORD(LONG(CARDINAL(wd)))
- ⓪&END
- ⓪$END;
- ⓪$IF Active THEN
- ⓪&IF Hex THEN
- ⓪(WriteStringNew(StrConv.LHexToStr(lw,0))
- ⓪&ELSIF signed THEN
- ⓪(WriteStringNew(StrConv.IntToStr(LONGINT(lw),0));
- ⓪&ELSE
- ⓪(WriteStringNew(StrConv.CardToStr(LONGCARD(lw),0));
- ⓪&END
- ⓪$END;
- ⓪"END dispNum;
- ⓪
- ⓪"PROCEDURE dispChar();
- ⓪"VAR ch:CHAR;
- ⓪"BEGIN
- ⓪$loadValue(ch);
- ⓪$IF Active THEN
- ⓪&IF ch<' ' THEN (* Steuerzeichen als Oktalkonstante anzeigen *)
- ⓪(WriteStringNew(StrConv.NumToStr(ORD(ch),8,0,' '));
- ⓪(WriteNew('C')
- ⓪&ELSE
- ⓪(WriteNew("'");
- ⓪(WriteNew(ch);
- ⓪(WriteNew("'");
- ⓪&END
- ⓪$END;
- ⓪"END dispChar;
- ⓪
- ⓪"PROCEDURE dispReal(long:BOOLEAN);
- ⓪"VAR sr:REAL;
- ⓪&lr:LONGREAL;
- ⓪"BEGIN
- ⓪$IF long THEN
- ⓪&loadValue(lr)
- ⓪$ELSE
- ⓪&loadValue(sr);
- ⓪&lr:=LONG(sr)
- ⓪$END;
- ⓪$IF Active THEN
- ⓪&WriteStringNew(StrConv.RealToStr(lr,0,6))
- ⓪$END;
- ⓪"END dispReal;
- ⓪
- ⓪"PROCEDURE dispBool();
- ⓪"VAR b:BOOLEAN;
- ⓪"BEGIN
- ⓪$loadValue(b);
- ⓪$IF Active THEN
- ⓪&IF b THEN
- ⓪(WriteStringNew('TRUE ')
- ⓪&ELSE
- ⓪(WriteStringNew('FALSE')
- ⓪&END
- ⓪$END;
- ⓪"END dispBool;
- ⓪
- ⓪"PROCEDURE dispString();
- ⓪"(* Für Strings werden Adresse und HIGH-Wert auf dem A3-Stack abgelegt *)
- ⓪"VAR high:CARDINAL;
- ⓪&ptr:POINTER TO CHAR;
- ⓪"BEGIN
- ⓪$loadValue(high);
- ⓪$loadValue(ptr);
- ⓪$IF Active THEN
- ⓪&WriteNew('"');
- ⓪&LOOP
- ⓪(IF ptr^=0C THEN
- ⓪*EXIT
- ⓪(END;
- ⓪(WriteNew(ptr^);
- ⓪(INC(ptr);
- ⓪(IF high=0 THEN
- ⓪*EXIT
- ⓪(END;
- ⓪(DEC(high)
- ⓪&END;
- ⓪&WriteNew('"')
- ⓪$END;
- ⓪"END dispString;
- ⓪
- ⓪ VAR no:CARDINAL;
- ⓪$old:BOOLEAN;
- ⓪
- ⓪ BEGIN
- ⓪"SaveCur;
- ⓪"IF switchscreen THEN
- ⓪$SetScreenBase(debugbase,debugbase,-1);
- ⓪$VSync
- ⓪"END;
- ⓪"GotoXY(xpos,ypos);
- ⓪"no:=CARDINAL(info.regPC^);
- ⓪"INC(info.regPC,2);
- ⓪"CASE no OF
- ⓪%0 : dispLine(m2Line,info)|
- ⓪$64 : dispLine(asmLine,info)|
- ⓪$66 : dispLine(procEntry,info)|
- ⓪$67 : dispLine(procExit,info)|
- ⓪"ELSE
- ⓪$CASE no OF
- ⓪*1,4 : dispNum(4,TRUE)|
- ⓪,2 : dispReal(TRUE)|
- ⓪+40 : dispReal(FALSE)|
- ⓪,3 : dispChar()|
- ⓪&35,34,9 : dispNum(2,FALSE)|
- ⓪ 8,20,23,25,26 : old:=Hex; Hex:=TRUE; dispNum(4,FALSE); Hex:=old|
- ⓪(21,41 : old:=Hex; Hex:=TRUE; dispNum(2,FALSE); Hex:=old|
- ⓪(30,22 : dispNum(4,FALSE)|
- ⓪+24 : dispBool()|
- ⓪+27 : dispString()|
- ⓪+33 : dispNum(2,TRUE)|
- ⓪(38,39 : old:=Hex; Hex:=TRUE; dispNum(1,FALSE); Hex:=old|
- ⓪$ELSE
- ⓪(DEC(info.regPC,2);
- ⓪(SetScreenBase(logbase,physbase,-1);
- ⓪(VSync;
- ⓪(RETURN TRUE
- ⓪$END;
- ⓪$IF Active THEN
- ⓪&WriteStringNew(' ')
- ⓪$END
- ⓪"END;
- ⓪"SetScreenBase(logbase,physbase,-1);
- ⓪"VSync;
- ⓪"RestoreCur;
- ⓪"RETURN FALSE
- ⓪ END HdlExc;
- ⓪
- ⓪ VAR stk:ARRAY[1..2000] OF WORD;
- ⓪$wsp:MemArea;
- ⓪$hdl:ADDRESS;
- ⓪$tHdl:TermCarrier;
- ⓪
- ⓪ PROCEDURE Terminate;
- ⓪ VAR ch:CHAR;
- ⓪ BEGIN
- ⓪"WriteLnNew;
- ⓪"screen:=TRUE;
- ⓪"WriteStringNew('Programmende:Bitte Taste...');
- ⓪"Close(outfile);
- ⓪"Read(ch);
- ⓪"SetScreenBase(logbase,physbase,-1);
- ⓪"VSync;
- ⓪"IF allocadr<>0L THEN
- ⓪$IF Free(allocadr) THEN END
- ⓪"END
- ⓪ END Terminate;
- ⓪
- ⓪ BEGIN
- ⓪"breakadr:=0L;
- ⓪"Active:=TRUE;
- ⓪"Step:=0L;
- ⓪"Continuous:=FALSE;
- ⓪"Hex:=FALSE;
- ⓪"LineAddr:=FALSE;
- ⓪"screen:=TRUE; file:=FALSE;
- ⓪"level:=-1L;
- ⓪"Create(outfile,'\DEBUG.LST',writeOnly,replaceOld);
- ⓪"logbase:=ScreenLogicalBase();
- ⓪"physbase:=ScreenPhysicalBase();
- ⓪"Alloc(33000L,allocadr);
- ⓪"IF allocadr=0L THEN
- ⓪$debugbase:=logbase
- ⓪"ELSE
- ⓪$debugbase:=(allocadr DIV 256L)*256L+256L;
- ⓪$SetScreenBase(debugbase,-1L,-1);
- ⓪$VSync;
- ⓪$Write(33C); Write('E');
- ⓪$SetScreenBase(logbase,-1L,-1);
- ⓪$VSync;
- ⓪"END;
- ⓪"debugscreen:=TRUE;
- ⓪"switchscreen:=TRUE;
- ⓪"(* damit erste Zeile sofort erscheint: *)
- ⓪"waitkey:=FALSE;
- ⓪"waitnext:=TRUE;
- ⓪"wsp.bottom:=ADR(stk);
- ⓪"wsp.length:=SIZE(stk);
- ⓪"InstallPreExc(ExcSet{TRAP5},HdlExc,TRUE,wsp,hdl);
- ⓪"IF hdl=NIL THEN
- ⓪$HALT
- ⓪"END;
- ⓪"CatchProcessTerm(tHdl,Terminate,wsp);
- ⓪ END TOSDebug.
- ⓪
- ⓪